home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 15 / CU Amiga Magazine's Super CD-ROM 15 (1997)(EMAP Images)(GB)[!][issue 1997-10].iso / CUCD / Utilities / Post / Source / Print.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-01  |  3.9 KB  |  164 lines

  1. #include "PostPre.h"
  2. #include "Global.h"
  3.  
  4. extern    int    page_counter;
  5. extern    BPTR    outfh;
  6.  
  7. struct    IODRPReq prreq;
  8. struct    PrinterData *prdata;
  9. struct    PrinterExtendedData *prextdata;
  10. struct    Preferences *prprefs;
  11. struct    RastPort prrast;
  12. ULONG        prsig;
  13. UBYTE        prstatus[2];
  14. int        propen=0;
  15.  
  16. /* Open the printer device and set up the page size */
  17.  
  18. BOOL setprinter(void)
  19. {
  20.     if (propen == 0)
  21.     {
  22.         if (OpenDevice("printer.device", 0,
  23.             (struct IORequest *) &prreq, 0) != 0)
  24.         {
  25.             okmsg("Can't open printer.device!");
  26.             ioerror = errioerror;
  27.             return(FALSE);
  28.         }
  29.         propen = 1;
  30.     }
  31.     if (prport == NULL)
  32.     {
  33.         prport = CreatePort(NULL, 0);
  34.         if (prport == NULL)
  35.         {
  36.             okmsg("Can't open printer port!");
  37.             CloseDevice((struct IORequest *) &prreq);
  38.             return(FALSE);
  39.         }
  40.         prreq.io_Message.mn_ReplyPort = prport;
  41.         prsig = 1 << prport->mp_SigBit;
  42.         prdata = (struct PrinterData *) prreq.io_Device;
  43.         prextdata = &prdata->pd_SegmentData->ps_PED;
  44.         prprefs = &prdata->pd_Preferences;
  45.     }
  46.     return(TRUE);
  47. }
  48.  
  49. /* Print the page */
  50.  
  51. static    int    ybase = 0;
  52. void printpage(struct BitMap *my_print_bm)
  53. {
  54.     ULONG sig;
  55.     UWORD prflags;
  56.  
  57. /*    char reset_cmd[] = "\0x1b""c";*/
  58.  
  59. /* Disable break exceptions so we can wait on the signal instead */
  60.  
  61.     SetExcept(0, SIGBREAKF_CTRL_C);
  62.     breakset = 0;
  63.  
  64. /* First check the printer is ready */
  65.  
  66.     if(setprinter() == FALSE) return;
  67.     prreq.io_Command = PRD_QUERY;
  68.     ((struct IOStdReq *) &prreq)->io_Data = (APTR) prstatus;
  69.     if (DoIO((struct IORequest *) &prreq))
  70.     {
  71.         ioerror = errioerror;
  72.         return;
  73.     }
  74.     if (((struct IOStdReq *) &prreq)->io_Actual == 1 && prstatus[0] & 3 != 0)
  75.         FPrintf(outfh, "printer not ready (CTRL/C to abort)\n");
  76.  
  77. /* Now dump the page */
  78.  
  79.     prrast.BitMap        = my_print_bm;
  80.     prreq.io_Command    = PRD_DUMPRPORT;
  81.     prreq.io_RastPort    = &prrast;
  82.     prreq.io_ColorMap    = (struct ColorMap *) &colormap;
  83.     prreq.io_Modes = 0;
  84.     prreq.io_SrcX = 0;
  85.     prreq.io_SrcY = 0;
  86.     prreq.io_SrcWidth = parm.page.xsize;
  87.     prreq.io_SrcHeight = parm.page.ysize;
  88.     prreq.io_Special = (SPECIAL_DENSITY1 * Options.PostOpts.prden) | SPECIAL_TRUSTME;
  89.     prprefs->PrintDensity = Options.PostOpts.prden;
  90.     if (bandrendering)
  91.     {
  92.         if (ybase + parm.page.ysize >= parm.page.yheight)
  93.         {
  94.             prreq.io_SrcHeight = parm.page.yheight - ybase;
  95.             ybase = -parm.page.ysize;
  96.         }
  97.         else
  98.         {
  99.             prreq.io_Special |= SPECIAL_NOFORMFEED;
  100.         }
  101.         ybase += parm.page.ysize;
  102.     }
  103.     if(Options.PostOpts.formfeed == FALSE) prreq.io_Special |= SPECIAL_NOFORMFEED;
  104.     if(Options.PostOpts.centerpage) prreq.io_Special |= SPECIAL_CENTER;
  105.     if (prextdata->ped_MaxXDots != 0)
  106.     {
  107.         if (prreq.io_SrcWidth > prextdata->ped_MaxXDots)
  108.         {
  109.             prreq.io_SrcWidth = prextdata->ped_MaxXDots;
  110.         }
  111.         if (prextdata->ped_MaxYDots != 0)
  112.         {
  113.             if (prreq.io_SrcHeight > prextdata->ped_MaxYDots)
  114.             {
  115.                 prreq.io_SrcHeight = prextdata->ped_MaxYDots;
  116.             }
  117.         }
  118.     }
  119.     prreq.io_DestCols = prreq.io_SrcWidth;
  120.     prreq.io_DestRows = prreq.io_SrcHeight;
  121.     prflags = prprefs->PrintFlags;
  122.     prprefs->PrintFlags = prflags & ~DIMENSIONS_MASK | IGNORE_DIMENSIONS;
  123.  
  124. /* We use asynchronous IO so we can abort it with a CTRL/C                     *
  125.  * The TaskPri has to be the same as the one of the printer.device task    *
  126.  * Otherwise the ctrl-c Feature does not work                                    */
  127.  
  128.     SendIO((struct IORequest *) &prreq);
  129.  
  130.     for (;;)
  131.     {
  132.         sig = Wait(prsig | SIGBREAKF_CTRL_C);
  133.         if (sig & SIGBREAKF_CTRL_C)
  134.         {
  135.             AbortIO((struct IORequest *) &prreq);
  136.             WaitIO((struct IORequest *) &prreq);
  137.             ioerror = errioerror;
  138.             break;
  139.         }
  140.         if (GetMsg(prport)) break;
  141.     }
  142.     while(GetMsg(prport));
  143.     if (prreq.io_Error != 0) ioerror = errioerror;
  144.  
  145. /* Restore break exceptions */
  146.  
  147.     SetExcept(~0, SIGBREAKF_CTRL_C);
  148.     breakset = 1;
  149.  
  150. /*    if(ioerror)
  151.     {
  152.         prreq.io_Command = CMD_WRITE;
  153.         ((struct IOStdReq *) &prreq)->io_Data = (APTR) reset_cmd;
  154.         ((struct IOStdReq *) &prreq)->io_Length = strlen(reset_cmd);
  155.         DoIO((struct IORequest *) &prreq);
  156.     }*/
  157.     prprefs->PrintFlags = prflags;
  158.     if (propen) CloseDevice((struct IORequest *) &prreq);
  159.     if (prport) DeletePort(prport);
  160.     propen = 0;
  161.     prport = 0;
  162.  
  163. }
  164.